﻿namespace Tszy.Unlimited.Base.Extensions;

/// <summary>
/// 时间类型扩展。
/// </summary>
public static class DateTimeExtensions
{
    /// <summary>
    /// 获得当前时间的时间戳（秒级）。
    /// </summary>
    /// <param name="dateTime">当前时间对象。</param>
    /// <returns>时间戳。</returns>
    public static int GetTimeStamp(this DateTime dateTime)
    {
        var value = new DateTimeOffset(dateTime).ToUnixTimeSeconds();

        return (int)value;
    }

    /// <summary>
    /// 获得当前时间的时间戳（毫秒级）。
    /// </summary>
    /// <param name="dateTime">当前时间对象。</param>
    /// <returns>时间戳。</returns>
    public static long GetTimeStampByMillisecond(this DateTime dateTime)
    {
        return new DateTimeOffset(dateTime).ToUnixTimeMilliseconds();
    }

    /// <summary>
    /// 获得去除时分秒后的当前时间。
    /// </summary>
    /// <param name="dateTime">当前时间。</param>
    /// <returns></returns>
    public static DateTime GetToday(this DateTime dateTime) => new(dateTime.Year, dateTime.Month, dateTime.Day);

    /// <summary>
    /// 获得指定时间所在的星期的星期一的时间。
    /// </summary>
    /// <param name="dateTime">当前时间。</param>
    /// <returns>星期一的时间。</returns>
    public static DateTime GetCurrentWeek(this DateTime dateTime)
    {
        switch (dateTime.DayOfWeek)
        {
            case DayOfWeek.Monday:
                return dateTime.GetToday();

            case DayOfWeek.Tuesday:
                return dateTime.GetToday().AddDays(-1);

            case DayOfWeek.Wednesday:
                return dateTime.GetToday().AddDays(-2);

            case DayOfWeek.Thursday:
                return dateTime.GetToday().AddDays(-3);

            case DayOfWeek.Friday:
                return dateTime.GetToday().AddDays(-4);

            case DayOfWeek.Saturday:
                return dateTime.GetToday().AddDays(-5);

            case DayOfWeek.Sunday:
                return dateTime.GetToday().AddDays(-6);
            default:
                break;
        }

        return dateTime.GetToday();
    }

    /// <summary>
    /// 获得指定时间所在的当月的 1 日的时间。
    /// </summary>
    /// <param name="dateTime">当前时间。</param>
    /// <returns>1 日的时间。</returns>
    public static DateTime GetCurrentMonth(this DateTime dateTime)
    {
        return new DateTime(dateTime.Year, dateTime.Month, 1);
    }

    /// <summary>
    /// 获得指定时间所在的季度的 1 日的时间。
    /// </summary>
    /// <param name="dateTime">当前时间。</param>
    /// <returns>本季 1 日的时间。</returns>
    public static DateTime GetCurrentSeason(this DateTime dateTime)
    {
        if (dateTime.Month <= 3)
        {
            return new DateTime(dateTime.Year, 1, 1);
        }

        if (dateTime.Month <= 6)
        {
            return new DateTime(dateTime.Year, 4, 1);
        }

        if (dateTime.Month <= 9)
        {
            return new DateTime(dateTime.Year, 7, 1);
        }

        if (dateTime.Month <= 12)
        {
            return new DateTime(dateTime.Year, 10, 1);
        }

        return dateTime;
    }

    /// <summary>
    /// 获得指定时间所在的当年的 1 月 1 日的时间。
    /// </summary>
    /// <param name="dateTime">当前时间。</param>
    /// <returns>当年的 1 月 1 日。</returns>
    public static DateTime GetCurrentYear(this DateTime dateTime)
    {
        return new DateTime(dateTime.Year, 1, 1);
    }

    /// <summary>
    /// 获得指定时间当天的开始时间和结束时间。
    /// </summary>
    /// <param name="dateTime">当前时间。</param>
    /// <returns>开始时间和结束时间。</returns>
    public static DateTime[] GetTodayScope(this DateTime dateTime)
    {
        var startTime = dateTime.GetToday();
        var endTime = startTime.AddDays(1);
        return new[] { startTime, endTime };
    }
}
